Trusted Advisorで「S3 の不完全なマルチパートアップロードの中止設定」が推奨されたので対処してみた

Trusted Advisorで「S3 の不完全なマルチパートアップロードの中止設定」が推奨されたので対処してみた

こんにちは、AWS事業本部 コンサルティング部の荒平(@0Air)です。

Trusted Advisorを普段ご覧の方は、ご存知の方が多いと思いますが、
2023 年 12 月 7 日に「Amazon S3 で不完全なマルチパートアップロードを中止するための設定」が追加されていました。
この項目に対応するための備忘録です。

https://docs.aws.amazon.com/ja_jp/awssupport/latest/user/aws-trusted-advisor-change-log.html

これは何?

説明文を見てみましょう。

(説明文)
各 S3 バケットに、7 日間が経過しても未完了のままとなっているマルチパートアップロードを中止する
ライフサイクルルールが設定されていることを確認してください。
これらの不完全なアップロードを中止したり、関連付けられたストレージを削除したりするためにライフサイクルルール
を使用することが推奨されています。

(アラート基準)
黄色: ライフサイクル設定バケットには、7 日間が経過しても未完了のままとなっている
すべてのマルチパートアップロードを中止するライフサイクルルールが含まれていません。

マルチパートアップロードでは、1つのファイル(オブジェクト)を複数に区分し、それぞれのパーツごとにS3バケットへアップロードすることができます。
一般的に100MBを超えるようなファイルをアップロードする際は、マルチパートアップロードを利用して複数のパーツに分けてアップロードすることが推奨されています。

これを利用すれば、スループットの向上、ネットワーク問題からの回復、アップロードの一時停止が可能です。
特に大容量のファイルでは、ネットワークの切断が発生した場合でも、最初からアップロードし直す必要が無い点が嬉しいです。

https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html

このマルチパートアップロード(MPU)が不完全な状態で放置されると、予期しないストレージコストが発生する場合があるため、7日が経過しても完了しないマルチパートアップロードは中止する、という設定を入れることがベストプラクティスになっています。

デフォルトでは、このライフサイクル設定は入っていないため、私個人のアカウントでも大半のバケットに警告が出ていました。

image-20240725164850653

対応方法

CloudShellからAWS CLIのコマンドを実行することで対応します。
前提として、特にCloudShellの起動権限、S3のライフサイクルを付与する権限を持つユーザーで操作するものとします。

【注意】このコマンドは、既存のライフサイクルルールを書き換えるため、既にS3バケットにルールが設定されている場合は利用に注意してください。

1. JSONファイルを用意する

以下のコードを lifecycle.json として保存します。(ファイル名は任意)

vim lifecycle.json
{
  "Rules": [
    {
      "ID": "AbortIncompleteMultipartUpload",
      "Status": "Enabled",
      "AbortIncompleteMultipartUpload": {
        "DaysAfterInitiation": 7
      },
      "Filter": {
        "Prefix": ""
      }
    }
  ]
}

なお、DaysAfterInitiation で7日経過したものを中止する設定にしていますが、環境に応じて日数を短くして問題ありません。
アーカイブなど他のルールを追加したい場合は、お好みでアレンジしてください。

2. バケットに対してライフサイクルポリシーを適用する

S3APIコマンドにてライフサイクルを設定します。

aws s3api put-bucket-lifecycle-configuration --bucket {バケット名} --lifecycle-configuration file://lifecycle.json

3. バケットへライフサイクルポリシーが適用されていることを確認する

以下のコマンドで確認することができます。
1で保存したポリシーが表示されれば完了です。

aws s3api get-bucket-lifecycle-configuration --bucket {バケット名}

image-20240727235754081

主な手順はここまでですが、アカウント内に大量のバケットがある場合、ちまちま実施するのは避けたいところです。
なので、一括で実施できるスクリプトを作りました。

対応方法(一括)

【注意】このスクリプトは、既存のライフサイクルルールを書き換えるため、既にS3バケットにルールが設定されている場合は利用に注意してください。

例えば、30日後にGlacierへ移動するという設定を入れている場合は、スクリプトの実行で無くなってしまいます。
バケットにルール配布したい場合は、lifecycle.json を書き換えるなど十分注意してください。

#!/bin/bash

buckets=({amazon-s3-bucket-name-1} {amazon-s3-bucket-name-2} {amazon-s3-bucket-name-3} ...)

cat << EOF > lifecycle.json
{
  "Rules": [
    {
      "ID": "AbortIncompleteMultipartUpload",
      "Status": "Enabled",
      "AbortIncompleteMultipartUpload": {
        "DaysAfterInitiation": 7
      },
      "Filter": {
        "Prefix": ""
      }
    }
  ]
}
EOF

for bucket in "${buckets[@]}"
do
    echo "Configuring bucket: $bucket"
    aws s3api put-bucket-lifecycle-configuration --bucket "$bucket" --lifecycle-configuration file://lifecycle.json

    if [ $? -eq 0 ]; then
        echo "Configuration applied successfully to $bucket"
    else
        echo "Failed to apply configuration to $bucket"
    fi
done

rm lifecycle.json
echo "Configuration process completed."

上記のスクリプトを保存して実行します。

vim config-s3.sh
chmod +x config-s3.sh
sh config-s3.sh

Failedが出ていなければ、正常にライフサイクルポリシーが適用されています。

image-20240728003951499

Trusted Advisorでは、即時チェックはされないため最大1日程度待つことになりますが、ステータスが変わって問題なくなっていることを確認できました。

image-20240728004132810

おわりに

「マルチパートアップロードなんて使ってないよ!」という声が聞こえそうですが、aws s3 cpaws s3 sync を利用すると自動で容量に応じてマルチパートになります。

https://repost.aws/ja/knowledge-center/s3-multipart-upload-cli

マルチパートアップロードは仕様上、「完了または中止された後にのみ、パートの保存に使用されていたスペースを解放し、保存に対する課金を停止」されるため(参考)、知らずに課金が発生している環境もあるかもしれません。
是非、Trusted Advisorを活用して中止設定が入っているか確認してください!

このエントリが誰かの助けになれば幸いです。
それでは、AWS事業本部 コンサルティング部の荒平(@0Air)がお送りしました!

参考

https://repost.aws/ja/knowledge-center/s3-reduce-costs

https://aws.amazon.com/jp/blogs/aws-cloud-financial-management/discovering-and-deleting-incomplete-multipart-uploads-to-lower-amazon-s3-costs/

https://dev.classmethod.jp/articles/aws-cost-optimize-cheat-sheet-202307/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.